export const ADDUSER = Symbol('add-user')
export const UPDATEUSER = Symbol('update-user')
export const DELUSER = Symbol('del-user')
export const SETUSER = Symbol('set-user')
export const SETLOADING = Symbol('set-loading')

/** 添加一个用户，user用户信息*/
export const createAddUserAction = (user) => ({ type: ADDUSER, payload: user })
/** 修改一个用户，id用户id,user用户信息*/
export const createUpdateUserAction = (id, user) => ({ type: ADDUSER, payload: { user, id } })
/** 删除一个用户，id用户id*/
export const createDelUserAction = (id) => ({ type: ADDUSER, payload: id })

/** 设置一组用户数据 */
export const craeteSetUsersAction = users => ({
    type: SETUSER,
    payload: users
})

/** 设置加载状态 */
export const craeteSetLoadingAction = isLoading => ({
    type: SETLOADING,
    payload: isLoading // 是否正在加载
})

/** 设置加载状态 redux-thunk */
export function fetchUsers() {
    // 由于thunk的存在，允许返回action是一个带有副作用的函数
    return async function (dispatch) {
        dispatch(craeteSetLoadingAction(true)) // 设置用户数据加载状态
        const usres = await new Promise((resove) => { // 异步加载数据
            setTimeout(() => {
                resove([{ id: 99, name: 'xx', age: 99 }])
            }, 1000)
        })
        dispatch(craeteSetUsersAction(usres))
        dispatch(craeteSetLoadingAction(false))
    }
}

/**
 * 设置加载状态 redux-promise
 * 由于使用了redux-promise中间件，因此，允许action是一个promise，在promise中，如果要触发action，则使用resolve
 **/
// export function fetchUsersPromise() {
//     return new Promise((resove, reject) => {
//         setTimeout(() => {
//             resove(craeteSetUsersAction([{ id: 99, name: 'xx', age: 99 }]))
//         }, 1000)
//     })
// }

// export async function fetchUsersPromise() {
//     const usres = await new Promise((resove) => {
//         setTimeout(() => resove([{ id: 99, name: 'xx', age: 99 }]), 1000)
//     })
//     return craeteSetUsersAction(usres)
// }

function getPayload() {
    return new Promise((resove, reject) => {
        setTimeout(() => resove([{ id: 99, name: 'xx', age: 99 }]), 1000)
    })
}

export async function fetchUsersPromise() {
    return {
        type: SETUSER,
        payload: await getPayload()
    }
}

